package singleton.example;

/**
 * 实现一种懒加载的单例模式
 * Created by yangliwei on 2017/11/9.
 */
public class Lazy {

    //构造方法私有化
    private Lazy(){};

    //这里使用volatile防止指令重排，拿到半个单例
    // https://monkeysayhi.github.io/2016/11/29/volatile%E5%85%B3%E9%94%AE%E5%AD%97%E7%9A%84%E4%BD%9C%E7%94%A8%E3%80%81%E5%8E%9F%E7%90%86/
    //volatile和final不能一起存在：volatile说明该变量引用可以被别的线程改变，
    // final说明该变量引用无法被改变，
    private static volatile Lazy lazy = null;
    public static Lazy getInstence(){

        //这里使用了DCL（double checked locking）双重校验锁 解决并发时的串行导致性能低下
        if(lazy==null){
            synchronized(Lazy.class){//防止并发 出现得到两个实例
                if(lazy ==null){
                    lazy = new Lazy();//因为这一步会出现指令重排序，所以需要把lazy用volatile修饰
                }
            }
        }
        return lazy;
    }
}
